package br.unicamp.ic.inf300.arena.persistencia.dao.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import br.unicamp.ic.inf300.arena.modelo.controleacesso.Perfil;
import br.unicamp.ic.inf300.arena.modelo.controleacesso.UsuarioSistema;
import br.unicamp.ic.inf300.arena.modelo.pessoa.Funcionario;
import br.unicamp.ic.inf300.arena.modelo.pessoa.Pessoa;
import br.unicamp.ic.inf300.arena.modelo.pessoa.TipoPessoa;
import br.unicamp.ic.inf300.arena.persistencia.dao.IFuncionarioDAO;
import br.unicamp.ic.inf300.arena.persistencia.dao.IPessoaDAO;
import br.unicamp.ic.inf300.arena.persistencia.dao.IUsuarioPerfilDAO;
import br.unicamp.ic.inf300.arena.persistencia.dao.IUsuarioSistemaDAO;
import br.unicamp.ic.inf300.framework.persistencia.SQLUtil;

public class UsuarioSistemaDAOHsql implements IUsuarioSistemaDAO {

	
	public UsuarioSistema inserir(Funcionario funcionario, String usuario, String senha, Perfil perfil) {
		try {
			UsuarioSistema usuarioSistema = null;
			String query = " INSERT INTO " + IUsuarioPerfilDAO.TABELA_BD_USER + " (id, login, senha, codperfil) VALUES (?, ?, ?, ?) ";
			Object[] params = new Object[]{funcionario.getId(), usuario, senha, perfil.getSequencial()};
			int result = SQLUtil.update(query, params);
			if (result == 1) {
				usuarioSistema = new UsuarioSistema(funcionario, usuario, senha, perfil);
			}
			return usuarioSistema;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public Collection<UsuarioSistema> buscarTodos() {
		try {
			String sql = " SELECT * FROM " + IPessoaDAO.TABELA_BD + " p, " + IFuncionarioDAO.TABELA_BD + " f, " + IUsuarioPerfilDAO.TABELA_BD_USER + " u WHERE p.id = f.id and f.id = u.id ";
			Collection<Object[]> collection = (Collection<Object[]>) SQLUtil.selectRecords(sql, null);
			Collection<UsuarioSistema> usuarios = new ArrayList<UsuarioSistema>(collection.size());
			for (Object[] objects : collection) {
				Pessoa pessoa = new Pessoa((Integer) objects[0], (String) objects[1], (String) objects[2], (Date) objects[3], TipoPessoa.get((Integer) objects[4]));
				Funcionario funcionario = new Funcionario(pessoa, (String) objects[6]);
				usuarios.add(new UsuarioSistema(funcionario, (String) objects[8], (String) objects[9], Perfil.get((Integer) objects[10])));
			}
			return usuarios;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public boolean atualizar(Integer id, String usuario, Perfil perfil) {
		try {
			String query = new String(" UPDATE " + IUsuarioPerfilDAO.TABELA_BD_USER + " SET login = ?, codperfil = ? WHERE id = ? ");
			Object[] params = new Object[]{usuario, perfil.getSequencial(), id};
			int result = SQLUtil.update(query, params);
			return result == 1;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public boolean remover(Integer id) {
		try {
			String query = new String(" DELETE FROM " + IUsuarioPerfilDAO.TABELA_BD_USER + " WHERE id = ? ");
			Object[] params = new Object[]{id};
			int result = SQLUtil.update(query, params);
			return result == 1;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}